using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// 滑块值监听器，实时监测Slider值变化并在值为0时销毁当前预制体
/// </summary>
[RequireComponent(typeof(Slider))] // 确保组件附加时自动添加Slider
public class SliderValueWatcher : MonoBehaviour
{
    [Header("滑块引用")]
    [Tooltip("需要监听的Slider组件，若为空将自动获取当前对象上的Slider")]
    public Slider targetSlider;

    [Header("销毁设置")]
    [Tooltip("是否在值为0时立即销毁，勾选则不延迟")]
    public bool destroyImmediately = true;
    [Tooltip("延迟销毁时间（秒），仅当destroyImmediately为false时生效")]
    [Range(0.1f, 5f)] public float destroyDelay = 0.5f;

    [Header("调试设置")]
    [Tooltip("是否输出调试信息")]
    public bool debugMode = false;

    private void Awake()
    {
        // 自动获取Slider组件（如果未指定）
        if (targetSlider == null)
        {
            targetSlider = GetComponent<Slider>();
            if (targetSlider == null)
            {
                Debug.LogError("SliderValueWatcher: 当前对象上未找到Slider组件！", this);
                enabled = false; // 禁用脚本避免错误
                return;
            }
            if (debugMode) Debug.Log("SliderValueWatcher: 自动获取到Slider组件", this);
        }

        // 注册值变化事件
        targetSlider.onValueChanged.AddListener(OnSliderValueChanged);

        // 初始检查（如果初始值就是0）
        if (Mathf.Approximately(targetSlider.value, 0))
        {
            OnSliderValueChanged(0);
        }
    }

    /// <summary>
    /// 滑块值变化时触发的回调函数
    /// </summary>
    /// <param name="value">当前滑块值（范围0-1）</param>
    private void OnSliderValueChanged(float value)
    {
        if (debugMode) Debug.LogFormat(this, "SliderValueWatcher: 当前值 = {0:F2}", value);

        // 检查值是否为0（考虑浮点数精度问题）
        if (Mathf.Approximately(value, 0))
        {
            DestroyPrefab();
        }
    }

    /// <summary>
    /// 销毁当前预制体
    /// </summary>
    private void DestroyPrefab()
    {
        if (debugMode) Debug.Log("SliderValueWatcher: 滑块值为0，准备销毁预制体", this);

        if (destroyImmediately)
        {
            Destroy(gameObject);
        }
        else
        {
            Destroy(gameObject, destroyDelay);
        }
    }

    private void OnDestroy()
    {
        // 移除事件监听，防止内存泄漏
        if (targetSlider != null)
        {
            targetSlider.onValueChanged.RemoveListener(OnSliderValueChanged);
        }
    }
}